<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="../debug/debug.js"></script>
<script>
	var debug;
	
	//객체 생성,프로퍼티 설정
	var obj = new Object();
	obj.val = 5;
	obj.click = function(){
		alert('hello');
	};
	
	var obj2 = {
			val:5,
			click:function(){
				alert('hello2');
			}
	};
	
	function simpleCreate(){
		debug.displayMsg(obj.val);
		debug.displayMsg(obj2.val);
		
	}
	
	//객체생성 with constructor
	function User(name,age){
		this.name= name;
	}
	
	User.prototype.getName = function(){
		return this.name;
	}
	
	User.prototype.getAge = function(){
		return this.age;
	}
	
	function createWithConstructor(){
		var me = new User('lee',32);
		debug.displayMsg(me.name);
		debug.displayMsg(me.constructor==User);
		User("test",32);
		debug.displayMsg(window.name);
	}
	
	function newUser(){
		var you = new User("sh",42);
		debug.displayMsg(you.getName());
	}
	
	
	function ClassRoom(student,teacher){
		/* 
		priviledge메소드 생성 방법 private 변수를 사용할수 있고, public 메소드로 사용할수 있다. 
		priviledge메소드는 처음 코드컴파일시 생성되지 않고 실행중에 동적으로 만들어진다. 
		*/
		this.disp=function(){
			debug.displayMsg(students.join(",")); // private 변수에 접근법 
			debug.displayMsg(this.teacher);       //public 변수에 접근
		} 		
		
		//private method
		/* function disp(){
			alert(this.names.join(","));
		} */
		
		/* 
		 - private valiable;
		var student = student; 
		*/
		
		function getStudents(){
			return students;  
		}
		
		this.getStudentName=function(){
			return getStudents();
		}
		
		var students  = student;
		this.teacher = teacher;
	}
	
	/* 
	ClassRoom 에대한 public 메소드 만들기
	ClassRoom.prototype.disp = function(){
		//code
	} 
	*/
	
	function objClass(){
		var obj = new ClassRoom(["jon","bob"],"Mr.smith");
		obj.disp();
		//debug.displayMsg(obj.students.join(","));    students는 private로 접근불가. private는 private끼리 접근가능
		debug.displayMsg("obj.getStudentName():"+obj.getStudentName());   //priviledge 메소드를 만들어서 private값인 students를 호출한다.
	}
	//메소드 설정후 호출부분에서 에러
	function User2(properties){
		 for ( var i in properties ) { (function(){
		        var prop = i;
		        // Create a new getter for the property
		        this[ "get" + i ] = function() {
		            return properties[prop];
		        };

		        // Create a new setter for the property
		        this[ "set" + i ] = function(val) {
		            properties[i] = val;
		        };
		    })(); 
			}
	}
	
	function user2Test(){
		var nuser = new User2({
		    name: "Bob",
		    age: 44
		});
		//debug.displayMsg("nuser.getName():"+nuser.getname()=="Bob");
		debug.displayMsg("nuser.name==null:"+(nuser.name==null));
		
	}

	window.onload=function(e){
		debug =  new DebugConsole();
		simpleCreate();
		createWithConstructor();
		newUser();
		objClass();
		user2Test();
	}

</script>
</head>

<body>

</body>
</html>